// axios
import axios from 'axios';
// 引入store
import store from '../store';
// 路由
import router from '../router';
// loading
import { Loading, Message } from 'element-ui';

import * as u from '@/utils/util'
import qs from "qs";
let loadingInit;

// 添加请求和响应拦截器
export default () => {
	
    // 配置请求
    let cancelToken = axios.CancelToken;
    let source = cancelToken.source();
    // 添加请求拦截器
    axios.interceptors.request.use((config) => {
        let url  = config.url;
        if (config.headers.needLoading) {
            loadingInit = Loading.service({
                lock: true,
                text: '加载中···',
                spinner: 'el-icon-loading',
                background: 'rgba(0, 0, 0, 0.7)'
            });
        }
        //所有的请求中配置的是同一个cancelToken，所以在之后的所有请求都会直接执行onCanceled方法        config.cancelToken = source.token;
        config.headers["Content-type"] = config.headers.file?"multipart/form-data":"application/json";
        // 添加token
        // config.headers['X-Access-Token'] = localStorage.getItem('token');
      if(localStorage.getItem('token')){
        config.headers['token'] = localStorage.getItem('token')
      }
        if (config.method === 'get' && config.params) {
            //如果是get请求，且params是数组类型如arr=[1,2]，则转换成arr=1&arr=2
            config.paramsSerializer =  (params) => {
                return qs.stringify(params,{arrayFormat:'repeat',encoding: false })
            }
            //  给data赋值以绕过if判断
            config.data = true
        }
        if (config.method === 'get' && config.params) {
            url += '?' // 拼接参数
            // 获取所有参数，通过循环 拼接所有参数，encodeURIComponent对参数编码，
            Object.keys(config.params).map(key => {
                url += `${key}=${encodeURIComponent(config.params[key])}&`
            })
            url = url.substring(0, url.length - 1) // 删除最后一个&字符
            config.params = {} // 参数已经存在于 url中
        }
        config.url = url;
        return config;
    }, (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    });
    // 添加响应拦截器
    axios.interceptors.response.use(async (response) => {
	    console.log('response',response)
        // 关闭loading
        loadingInit && loadingInit.close();
        // 统一处理非200的错误处理
        if (response.data.code && response.data.code !== 200) {
            Message.error({
                message: response.data.msg,
                duration: 1000
            });
            // 对响应数据401做点什么
            if (response.data.code === 401) {
                // 取消所有请求
                source.cancel();
                // 取消请求之后，重新配置source
                cancelToken = axios.CancelToken;
                source = cancelToken.source();
                await store.dispatch('commitClearUserData');
                await router.push({ path: '/login' });
            }

            return Promise.reject()

        }else{
            //请求成功才回调
            return response;
        }
    }, (error) => {
        if (error.response &&  error.response.data && error.response.data.code==401) {
            window.localStorage.removeItem('token');
            router.push({ path: '/login' });
        }
        // 关闭loading
        loadingInit && loadingInit.close();
        // 对响应错误做点什么
        return Promise.reject(error);
    });
};
